package br.com.vpsa.previdordevendas.model.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.vpsa.previdordevendas.model.entity.Inflacao;
import br.com.vpsa.previdordevendas.model.service.InflacaoService;
import br.com.vpsa.previdordevendas.model.util.CalendarUtils;

@Service
public class InflacaoServiceImpl implements InflacaoService
{
	@PersistenceContext
	private EntityManager em;

	@Override
	@Transactional
	public void salvarInflacao( String base, List<Inflacao> inflacoes )
	{
		
		Inflacao.moedaToValor( inflacoes );
		for ( Inflacao inflacao : inflacoes )
		{
			inflacao.setBase( base );
			if ( inflacao.getValor() != null )
			{
				em.persist( inflacao );
			}
		}
	}

	@Override
	public List<Inflacao> listarInflacoes( String base )
	{
		List<Inflacao> inflacoes = new ArrayList<Inflacao>();
		List<Inflacao> inflacoesSalvas = listarInflacoesAnuais( base );

		int anoAtual = CalendarUtils.getAnoAtual();

		for ( int ano = anoAtual ; ano <= anoAtual + CalendarUtils.ANOS_FUTUROS; ano++ )
		{
			Inflacao inflacaoAnual = getInflacaoAno( inflacoesSalvas, ano );
			inflacoes.add( inflacaoAnual );
		}
		Inflacao.valorToMoeda( inflacoes );
		return inflacoes;
	}

	private Inflacao getInflacaoAno( List<Inflacao> inflacoes, int ano )
	{
		Inflacao inflacao = Inflacao.find( inflacoes, ano );

		if ( inflacao == null )
		{
			inflacao = new Inflacao( ano );
			inflacao.setValor( Inflacao.INFLACAO_PADRAO );
		}

		return inflacao;
	}

	private List<Inflacao> listarInflacoesAnuais( String base )
	{
		String hql = "FROM Inflacao i where i.base = :base order by i.ano asc";

		TypedQuery<Inflacao> query = em.createQuery( hql, Inflacao.class );
		query.setParameter( "base", base );
		return query.getResultList();
	}

	@Override
	@Transactional
	public void apagarInflacoes(String base) 
	{
		String hql = "delete from Inflacao p where p.base = :base";
		
		Query query = em.createQuery(hql);
		query.setParameter("base", base);
		
		query.executeUpdate();
	}

	@Override
	public Inflacao getInflacao(String base, int ano) {
		String hql = "FROM Inflacao i where i.base = :base and i.ano = :ano";

		TypedQuery<Inflacao> query = em.createQuery( hql, Inflacao.class );
		query.setParameter( "base", base );
		query.setParameter( "ano", ano );
		
		List<Inflacao> inflacaoList = query.getResultList();
		
		return inflacaoList.isEmpty() ? null : inflacaoList.get(0);
	}
}
